using System;
using UnityEngine;

/// <summary>
/// 复用列表控制器
/// </summary>
public abstract class UIReuseItemCtrl : GameMonoBehaviour, IUIReuseItemCtrl
{
    /// <summary>
    /// Variable 实例，由框架自动初始化
    /// </summary>
    protected object VariableInstance { get; set; }

    /// <summary>
    /// 下标
    /// </summary>
    protected int Index => (this as IUIReuseItemCtrl).index;
    /// <summary>
    /// 用户自定义数据
    /// </summary>
    protected object UserData => (this as IUIReuseItemCtrl).userDataGetter.userData;
    /// <summary>
    /// 是否选中
    /// </summary>
    protected bool IsSelected => (this as IUIReuseItemCtrl).isSelected;
    /// <summary>
    /// 资源加载模块
    /// </summary>
    protected IResModule Res => (this as IUIReuseItemCtrl).resModule;
    /// <summary>
    /// Item的RectTransform (只读: 由于Item是复用, 禁止作为ReuseItemCtrl成员)
    ///     * 动态Item可在OnRefresh回调中设置其大小
    /// </summary>
    protected RectTransform RectTransform => (this as IUIReuseItemCtrl).rectTransform;
    /// <summary>
    /// 初始化 Variable，由生成的代码实现
    /// </summary>
    protected virtual void InitVariable(UIReuseItem view) { }
    /// <summary>
    /// 显示回调（UIReuseItem 专用，不会被 Unity 生命周期调用）
    /// </summary>
    protected virtual void OnItemEnable() { }
    
    /// <summary>
    /// 隐藏回调（UIReuseItem 专用，不会被 Unity 生命周期调用）
    /// </summary>
    protected virtual void OnItemDisable() { }
    
    // 重写 GameMonoBehaviour 的 OnEnable/OnDisable，调用 UIReuseItem 的回调
    protected override void OnEnable()
    {
        base.OnEnable();
        OnItemEnable();
    }
    
    protected override void OnDisable()
    {
        OnItemDisable();
        base.OnDisable();
    }
    /// <summary>
    /// 触发刷新时回调
    /// </summary>
    protected virtual void OnRefresh() { }

    #region 框架Call

    int IUIReuseItemCtrl.index { get; set; }
    IUserDataGettable IUIReuseItemCtrl.userDataGetter { get; set; }
    IResModule IUIReuseItemCtrl.resModule { get; set; }
    bool IUIReuseItemCtrl.isSelected { get; set; }
    RectTransform IUIReuseItemCtrl.rectTransform { get; set; }

    void IUIReuseItemCtrl.Enable()
    {
        try
        {
            OnItemEnable();
        }
        catch (Exception e)
        {
            Debug.LogError($"{GetType().FullName}.OnItemEnable Exception: {e.Message}\nStackTrace: {e.StackTrace}");
        }
    }

    void IUIReuseItemCtrl.Disable()
    {
        try
        {
            OnItemDisable();
        }
        catch (Exception e)
        {
            Debug.LogError($"{GetType().FullName}.OnItemDisable Exception: {e.Message}\nStackTrace: {e.StackTrace}");
        }
    }

    void IUIReuseItemCtrl.Refresh()
    {
        try
        {
            OnRefresh();
        }
        catch (Exception e)
        {
            Debug.LogError($"{GetType().FullName}.OnRefresh Exception: {e.Message}\nStackTrace: {e.StackTrace}");
        }
    }

    void IUIReuseItemCtrl.InitVariable(UIReuseItem view)
    {
        try
        {
            InitVariable(view);
        }
        catch (Exception e)
        {
            Debug.LogError($"{GetType().FullName}.InitVariable Exception: {e.Message}\nStackTrace: {e.StackTrace}");
        }
    }
    #endregion
}

